vlwkaos' digital garden

Type-Challeneges 쉬움 난이도

  • typeof 를 가졍하기

4 Pick

Pick Utility Type을 직접 구현하자.


type Pick<T, K extends keyof T> = {
    [key in K]: T[key] // key: typeof T[key]
}

7 Readonly

Readonly Utility Type을 직접 구현하자.

제너릭 T의 속성을 모두 readonly로 다시 지정. 🤔 오브젝트의 경우 freeze 이용해야 하지 않을까?

type MyReadonly<T> = {
    readonly [key in keyof T]: T[key];
}

11 Tuple to Object

Tuple을 Object로 변환하자

type의 형태를 구조적으로 이용할 수 있다. T[number]에 대해 더 알아보기. 조건부 타입

type TupleToObject<T extends readonly any[]> = {
    [e in T[number]]: e
}

14 First of Array

배열 T의 첫번째 항목의 타입을 반환하는 First<T> 구현하기

type First<T extends any[]> = T extends [] ? never: T[0];

// T extends [number] 이면 T는 숫자 하나를 가진 배열 타입 ex) [1], [2], [3], ...

18 Length of Tuple

Tuple이 주어졌을 때 길이를 타입으로 반환하는 타입 구현하기

type Length<T extends any> = T extends readonly any[] ? T['length'] : never;

🤔 readonly를 빼먹으면 안된다. 왜? Tuple은 타입이 고정되어 있다. readonly any[]

43 Exclude

기본 제공 Utility Type인 Exclude<T, U>를 구현하기 Union Type T에서 Union Type U을 빼는 기능 key값을 빼는게 아니다.

type MyExclude<T, U> = T extends U ? never: T;
// 예를 들어 MyExclude<string | number, number> 이렇게 되면
// string extends number -> false -> string
// number extends number -> true -> never
// ... 
// 이런식으로 최종 Type이 결정된다

189 Awaited

Promise<ExampleType>에서 ExampleType을 뽑아내기?

type MyAwaited<T extends Promise<any>> = T extends Promise<infer U> 
    ? (U extends Promise<any> ? MyAwaited<U> : U)  // 재귀
    : never;

268 If

조건 C가 주어졌을 때 참이면 타입 T를, 거짓이면 타입 F를 반환하는 타입, 단 Ctrue거나 false

type If<C, T, F> = C extends true ? T : F;

533 Concat

Array.concat을 타입시스템으로 구현하기. 즉, 배열 두개를 붙인 타입을 반환

type Concat<T, U> = T extends [...infer A] 
? (U extends [...infer B] ? [...A, ...B] : never) 
: never

//혹은
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]

898 Includes

Array.includes를 타입시스템으로 구현하기. 반환 타입은 true 혹은 false가 되어야한다.

type Includes<T extends readonly any[], U> = T extends [infer K, ...infer Rest] ? Equal<U, K> : Includes<Rest, U>

#todo Equal<U, K> 에 대한 설명이 필요함

3057 Push

Array.push의 제너릭 버전을 구현

type Push<T extends any[], U> = [...T, U];

3060 Unshift

Array.unshift의 제너릭 버전을 구현

type Unshift<T extends any[], U> = [U, ...T];

3312 Parameters

함수가 가진 인자 타입을 구현

type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer A) => any ? A : never;

함수에서 ...args의 타입을 주면된다.

[[Type-Challeneges 중간 난이도]]

Type-Challeneges 쉬움 난이도